/*-------------------------------------------------------------------------
 *
 * pg_database.h
 *	  "数据库" 系统目录 (pg_database) 的定义
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_database.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式
 *	  信息。
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_DATABASE_H
#define PG_DATABASE_H

#include "catalog/genbki.h"
#include "catalog/pg_database_d.h"

/* ----------------
 *		pg_database 定义。cpp 将其转换为
 *		typedef struct FormData_pg_database
 * ----------------
 */
CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248,DatabaseRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
	/* oid */
	Oid			oid;

	/* 数据库名称 */
	NameData	datname;

	/* 数据库的拥有者 */
	Oid			datdba BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid);

	/* 字符编码 */
	int32		encoding;

	/* 区域设置提供者，请参见 pg_collation.collprovider */
	char		datlocprovider;

	/* 允许作为 CREATE DATABASE 模板？ */
	bool		datistemplate;

	/* 允许新连接？ */
	bool		datallowconn;

	/*
	 * 允许的最大连接数。负值有特殊含义，请参见下面的 DATCONNLIMIT_* 定义。
	 */
	int32		datconnlimit;

	/* 此数据库中所有 Xid < 此值被冻结 */
	TransactionId datfrozenxid;

	/* 数据库中的所有多事务 >= 此值 */
	TransactionId datminmxid;

	/* 此数据库的默认表空间 */
	Oid			dattablespace BKI_LOOKUP(pg_tablespace);

#ifdef CATALOG_VARLEN			/* 可变长度字段从这里开始 */
	/* LC_COLLATE 设置 */
	text		datcollate BKI_FORCE_NOT_NULL;

	/* LC_CTYPE setting */
	text		datctype BKI_FORCE_NOT_NULL;

	/* ICU locale ID */
	text		daticulocale;

	/* 依赖于提供者的排序数据的版本 */
	text		datcollversion BKI_DEFAULT(_null_);

	/* 访问权限 */
	aclitem		datacl[1];
#endif
} FormData_pg_database;

/* ----------------
 *		Form_pg_database 对应于指向具有
 *		pg_database 关系格式的元组的指针。
 * ----------------
 */
typedef FormData_pg_database *Form_pg_database;

DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex);

DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops));
DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops));

/*
 * pg_database.dat 包含 template1 的条目，但不包含 template0
 * 或 postgres 数据库，因为这些在 initdb 中稍后创建。
 * 然而，我们仍然希望手动分配 template0 和
 * postgres 的 OID，因此在此声明。
 */
DECLARE_OID_DEFINING_MACRO(Template0DbOid, 4);
DECLARE_OID_DEFINING_MACRO(PostgresDbOid, 5);

/*
 * pg_database.datconnlimit 的特殊值。正常值是 >= 0。
 */
#define		  DATCONNLIMIT_UNLIMITED	-1	/* no limit */

/*
 * 在被删除的过程中，数据库被设置为无效。
 * 将 datconnlimit=-2 用于此目的并不是特别干净，但可以进行补丁。
 */
#define		  DATCONNLIMIT_INVALID_DB	-2

extern bool database_is_invalid_form(Form_pg_database datform);
extern bool database_is_invalid_oid(Oid dboid);

#endif							/* PG_DATABASE_H */
